iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0
生成式 AI

LLM 應用、開發框架、RAG優化及評估方法 系列 第 17

Day17 GAI爆炸時代 - Azure OpenAI、Gateway介紹

  • 分享至 

  • xImage
  •  

1. Azure OpenAI (簡稱AOAI)

Azure OpenAI 是由 Microsoft 提供的雲端服務,允許企業在 Azure 平台上使用 OpenAI 的模型。主要是預防企業串接後資料被用來訓練,以下介紹其主要特點:

  • 流量管制

    • Azure 提供了嚴格的流量管理和限制功能,允許用戶根據自己的需求設置配額和速率限制。
    • 可以使用 Azure 的監控工具來跟蹤 API 請求和流量使用情況,並設定警報來防止過度使用。
  • 資料安全

    • Azure 提供了高度安全的基礎設施,包括數據加密、網絡隔離和合規性認證,確保用戶數據的保密性和完整性。
    • 用戶資料不會被用來訓練 OpenAI 的模型。Azure 明確保證所有通過 Azure OpenAI 的數據都僅用於提供 API 的響應,不會用於模型再訓練。
  • 企業整合

    • Azure OpenAI 可以與其他 Azure 服務無縫整合,例如 Azure 的身份驗證、監控、分析和資料庫服務,為企業提供完整的雲端解決方案。
    • 支援混合雲和多雲環境的部署,方便企業靈活運用。

2. Gateway API

Gateway API 通常指的是直接從 OpenAI 提供的 API 入口進行串接,而非透過 Azure 等第三方平台。公司內部可自行管制訪問流量,設定好後即可確保是內網才可進行訪問,以下介紹其主要特點:

  • 流量管制

    • OpenAI 自身提供的流量管制相對較少,用戶必須自行管理 API 請求的速率和流量使用情況。
    • 可以通過設置 API 密鑰和計劃來限制使用,但不如 Azure 提供的工具那麼強大和細緻。
  • 資料安全

    • OpenAI 保證其不會用來自 API 請求的資料進行模型訓練,並且數據處理符合 GDPR 等隱私法規。
    • 但是相較於 Azure,OpenAI 提供的資料安全功能可能沒有 Azure 這麼全面,因為 Azure 是一個完整的企業級雲平台。
  • 整合與控制

    • Gateway API 提供了更直接的控制,適合需要最大靈活性且對雲服務有自己設置和維護能力的用戶。
    • 但是,它缺乏 Azure 的企業級工具和支持,這可能對於一些希望使用綜合服務的公司來說是個限制。

比較表格:

特點 Azure OpenAI Gateway API
流量管制 提供嚴格的流量管理和限制功能,支持自定義配額和速率限制 基本的流量控制,需要用戶自行管理 API 請求速率和流量
資料安全 提供高度安全的基礎設施和數據加密,數據不會用於模型訓練 保證數據不會用於模型訓練,但安全功能較 Azure 不全面
企業整合 可與 Azure 的身份驗證、監控、分析等服務無縫整合 提供更直接的 API 控制,但缺乏 Azure 的企業級工具和支持
部署選項 支持混合雲和多雲環境,靈活的企業級部署方案 提供靈活的 API 接入,適合自我管理和控制的用戶
隱私與合規 符合多項隱私和合規性認證(如 GDPR),提供完善的合規工具 支持基本的隱私法規合規(如 GDPR),但缺乏全面合規工具

AOAI 串接範例:

import os
from openai import AzureOpenAI

client = AzureOpenAI(
  azure_endpoint = "", 
  api_key="",  
  api_version=""
)

response = client.chat.completions.create(
    model="gpt-4o", # model = "deployment_name".
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Does Azure OpenAI support customer managed keys?"},
        {"role": "assistant", "content": "Yes, customer managed keys are supported by Azure OpenAI."},
        {"role": "user", "content": "Do other Azure AI services support this too?"}
    ]
)

print(response.choices[0].message.content)

Gateway 設定:

要使用 Gateway 串接 OpenAI 模型,需要先建立並配置 Gateway。以下是詳細的步驟:

1. 設置 Gateway

  1. 選擇主機環境

    • 選擇在雲端(如 Azure、AWS)或本地環境(如自建伺服器或 Docker)部署 Gateway。
    • 例如,使用 Azure Web App 部署,或在 Kubernetes 集群上設置一個 API Gateway。
  2. 設置 API Gateway

    • 選擇一個 API Gateway 解決方案,例如 Kong Gateway、AWS API Gateway、或 Azure API Management。
    • 配置你的 Gateway 來轉發請求到 OpenAI API,這樣用戶可以通過 Gateway 訪問 OpenAI 模型。
    • 配置路由規則,確保 Gateway 能夠正確處理不同的 API 請求並將它們轉發到正確的 OpenAI 模型。
  3. 設置 API 路由

    • 在 Gateway 中設定路由,將對 gpt-4o 或其他模型的請求轉發到對應的 OpenAI API 端點。
    • 你可以將路由配置為根據請求中的模型名稱來決定轉發到哪個 OpenAI 模型。例如:
      • /gateway/chat/completions/gpt-4o 轉發到 GPT-4 OpenAI API。
      • /gateway/chat/completions/gpt-35-turbo 轉發到 GPT-3.5 OpenAI API。
  4. 配置認證

    • 在 Gateway 中配置 API 認證,如 API 密鑰或 OAuth2.0,以保護你的 API 不被未經授權的用戶訪問。
    • 將 API 密鑰或其他憑證保存為環境變量,然後在 Gateway 的配置中引用這些變量。

2. 部署 Gateway

  1. 將 Gateway 部署到雲端或本地環境

    • 使用 Azure Web App 或 AWS Lambda 部署 Gateway,這些服務提供高可用性和自動擴展能力。
    • 如果你選擇本地部署,可以使用 Docker 或 Kubernetes 來管理和擴展 Gateway。
  2. 測試 Gateway

    • 在部署後,測試 Gateway 是否能夠正確轉發請求到 OpenAI API。
    • 使用 Postman 或 cURL 發送測試請求到 Gateway,並檢查是否返回了正確的回應。

3. 訪問 Gateway

  1. 獲取 Gateway 的 URL

    • 部署完成後,你將獲得一個 Gateway 的訪問 URL。這個 URL 將用於所有的 API 請求。
    • 例如,如果使用 Azure Web App 部署,URL 可能是 https://your-gateway-name.azurewebsites.net/gateway/chat/completions/gpt-4o
  2. 發送請求

    • 使用上面的 URL 發送 API 請求。你可以使用任何 HTTP 客戶端(如 Python 的 requests 模組、Postman、或 cURL)來發送請求。
    • 請求的格式與直接訪問 OpenAI API 時的格式相同,只是 URL 不同。你仍然需要傳遞消息和必要的 headers。
    import requests
    
    url = "https://your-gateway-name.azurewebsites.net/gateway/chat/completions/gpt-4o"
    headers = {
        "api-key": "your-gateway-api-key",
        "Content-Type": "application/json"
    }
    payload = {
        "messages": [
            {"role": "system", "content": "你是一個聰明的程式設計師"},
            {"role": "user", "content": "python算是OOP嗎?"}
        ]
    }
    response = requests.post(url, headers=headers, json=payload)
    print(response.json())
    
  3. 管理和監控 Gateway

    • 使用你的雲服務提供商的監控工具來追踪 API 請求的流量、錯誤率和響應時間。
    • 如果需要,可以配置自動擴展和容錯處理,以確保 Gateway 在高負載下也能正常運行。

這樣,你的 Gateway 就能夠充當一個中間層,方便用戶訪問和管理 OpenAI 的服務囉!

最後,若有想要測試AOAI、Gateway response time的朋友,這邊也提供範例程式碼

AOAI response time

import os
import requests
from dotenv import load_dotenv
from datetime import datetime
import csv
import json

# 加載 .env 文件中的環境變數
load_dotenv()

# 獲取 API 基本信息
azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
api_key = os.getenv("AZURE_OPENAI_API_KEY")
api_version = "2024-02-01"

def send_openai_request(model, messages):
    try:
        # 記錄開始時間
        start_time = datetime.now()
        print(f"Start time: {start_time.strftime('%Y-%m-%d %H:%M:%S.%f')}")

        # 設置請求 URL 和 headers
        url = f"{azure_endpoint}/openai/deployments/{model}/chat/completions?api-version={api_version}"
        headers = {
            "Content-Type": "application/json",
            "api-key": api_key
        }

        # 創建 chat completion 請求
        data = {
            "messages": messages
        }
        response = requests.post(url, headers=headers, data=json.dumps(data), verify=False)

        # 記錄結束時間
        end_time = datetime.now()
        print(f"End time: {end_time.strftime('%Y-%m-%d %H:%M:%S.%f')}")

        # 計算總共花費的時間
        duration = end_time - start_time
        print(f"Time taken: {duration}")

        # 檢查請求是否成功
        if response.status_code == 200:
            return start_time, end_time, duration, response.json()
        else:
            print(f"Request failed with status code {response.status_code}: {response.text}")
            return None, None, None, None
    except Exception as e:
        print(f"Error: {e}")
        return None, None, None, None

# 嵌入模型名稱列表
models = [
    "gpt-35-turbo-0613",
    "gpt-4-turbo",
    "gpt-4o"
]

# 準備發送到 OpenAI 的數據
input_text = "電動車的普及及如何影響保險行業的風險評估和定價策略?請簡要說明。"
messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": input_text}
]

# 開啟 CSV 文件,準備寫入
with open('chat_completion_results.csv', 'w', newline='', encoding='utf-8') as csvfile:
    fieldnames = ['model', 'start_time', 'end_time', 'duration']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()

    for model in models:
        for i in range(50):
            print(f"第 {i+1} 次 - 模型: {model}")
            start_time, end_time, duration, response = send_openai_request(model, messages)
            if start_time and end_time and duration:
                writer.writerow({
                    'model': model,
                    'start_time': start_time.strftime('%Y-%m-%d %H:%M:%S.%f'),
                    'end_time': end_time.strftime('%Y-%m-%d %H:%M:%S.%f'),
                    'duration': duration
                })
                print(response['choices'][0]['message']['content'])
            else:
                print("Request failed, skipping this iteration.")
            print('\n')

Gateway response time

import requests
from rich import print as pprint
import json
from datetime import datetime
import csv

def send_openai_request(url, headers, payload):
   # 記錄開始時間
   start_time = datetime.now()
   print(f"Start time: {start_time.strftime('%Y-%m-%d %H:%M:%S.%f')}")
   # 發送 POST 請求
   response = requests.post(url, headers=headers, json=payload, verify=False)
   # 記錄結束時間
   end_time = datetime.now()
   print(f"End time: {end_time.strftime('%Y-%m-%d %H:%M:%S.%f')}")
   # 計算總共花費的時間
   duration = end_time - start_time
   print(f"Time taken: {duration}")
   return start_time, end_time, duration
# 模型名稱列表
models = [
   "gpt-35-turbo-16k",
   "gpt-4-turbo",
   "gpt-4o"
]
# 添加你的 headers 信息
headers = {
       "api-key": "H7UXkDQiYX6+frijH+aGDA==",
       "systemId": "0003R3"
}
# 準備發送到 OpenAI 的數據
payload = {
   "messages": [
       {"role": "system", "content": "你是金融專家"},
       {"role": "user", "content": "電動車的普及及如何影響保險行業的風險評估和定價策略?請簡要說明。"}
   ]
}
# 開啟 CSV 文件,準備寫入
with open('results.csv', 'w', newline='', encoding='utf-8') as csvfile:
   fieldnames = ['model', 'start_time', 'end_time', 'duration']
   writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
   writer.writeheader()
   for model in models:
       url = f"https://XXX-container.azurewebsites.net/gateway/chat/completions/{model}"
       for i in range(50):
           print(f"第 {i+1} 次 - 模型: {model}")
           start_time, end_time, duration = send_openai_request(url, headers, payload)
           writer.writerow({
               'model': model,
               'start_time': start_time.strftime('%Y-%m-%d %H:%M:%S.%f'),
               'end_time': end_time.strftime('%Y-%m-%d %H:%M:%S.%f'),
               'duration': duration
           })
           print('\n')

就可以產生.csv紀錄模型回應的時間囉!
https://ithelp.ithome.com.tw/upload/images/20240817/20168537WtADLqfIWb.png

那今天就先介紹到這啦,下一次要介紹的是
市面上Vector DB間的比較,選擇好Vector DB後
就可以準備開始進入RAG的實作囉!


上一篇
Day16 GAI爆炸時代 - LangChain 串接 MongoDB (下)
下一篇
Day18 GAI爆炸時代 - 市面上 Vector DB 比較
系列文
LLM 應用、開發框架、RAG優化及評估方法 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言